home *** CD-ROM | disk | FTP | other *** search
/ Apple WWDC 1996 / WWDC96_1996 (CD).toast / Technology Materials / MacApp Release 10 / MacApp Release 10 - HD Ready / Libraries / Core / Sources / UObject.cp < prev    next >
Encoding:
Text File  |  1996-04-03  |  11.7 KB  |  434 lines  |  [TEXT/MPS ]

  1. //----------------------------------------------------------------------------------------
  2. // UObject.cp
  3. // Copyright © 1984-96 by Apple Computer, Inc. All rights reserved.
  4. //----------------------------------------------------------------------------------------
  5.  
  6. #ifndef __UOBJECT__
  7. #include "UObject.h"
  8. #endif
  9.  
  10. // MacApp
  11.  
  12. #if qDebug || qTheDebugger
  13. #ifndef __UDEBUG__
  14. #include "UDebug.h"
  15. #endif
  16. #endif
  17.  
  18. #ifndef __UDEPENDENCIES__
  19. #include "UDependencies.h"
  20. #endif
  21.  
  22. #ifndef __UFAILURE__
  23. #include "UFailure.h"
  24. #endif
  25.  
  26. // StripLong etc.
  27. #ifndef __UCOREUTILITIES__
  28. #include "UCoreUtilities.h"
  29. #endif
  30.  
  31. // SetPermHandleSize, etc.
  32. #ifndef __UMEMORY__
  33. #include "UMemory.h"
  34. #endif
  35.  
  36. #ifndef __USTREAM__
  37. #include "UStream.h"
  38. #endif
  39.  
  40. #if qDebug || qTheDebugger
  41. #ifndef __UTHEDEBUGGER__
  42. #include "UTheDebugger.h"
  43. #endif
  44. #endif
  45.  
  46. // ANSI
  47.  
  48. #ifndef __STDIO__
  49. #include <stdio.h>
  50. #endif
  51.  
  52. // Voodoo Monkey
  53.  
  54. #if qInspector
  55. #ifndef __NUBINSPECTORHOOKS__
  56. #include "NubInspectorHooks.h"
  57. #endif
  58. #endif
  59.  
  60. #ifndef qMacApp
  61. #define qMacApp FALSE
  62. #endif
  63.  
  64. //----------------------------------------------------------------------------------------
  65. // Globals
  66. //----------------------------------------------------------------------------------------
  67.  
  68. // pObjectAllocationFlag is set to true in TObject::TObject, and set back to false in 
  69. // TObject::IObject and TObject::ReadFrom.  This is used to warn the programmer that forgets
  70. // to call TObject::IObject or TObject::ReadFrom.  Forgetting this means the inspector won't
  71. // know about the object.
  72.  
  73. #if qInspector
  74. static Boolean pObjectAllocationFlag;
  75. static TObject* pLastObject;
  76. #endif
  77.  
  78.  
  79. //========================================================================================
  80. // CLASS TObject
  81. //========================================================================================
  82. #undef Inherited
  83.  
  84. #pragma segment MAOpen
  85. MA_DEFINE_CLASS_M0(TObject);
  86.  
  87. //----------------------------------------------------------------------------------------
  88. // TObject::TObject:
  89. //----------------------------------------------------------------------------------------
  90. #pragma segment ConstructorRes
  91. // Note that this cannot be inlined without dropping turds all over the place. Probably
  92. // this is because TObject has a virtual destructor
  93. void TObject::operator delete(void* obj)
  94. {
  95.     MAOperatorDelete(obj);
  96. }
  97.  
  98. //----------------------------------------------------------------------------------------
  99. // TObject::TObject:
  100. //----------------------------------------------------------------------------------------
  101. #if qInspector
  102. #pragma segment ConstructorRes
  103.  
  104. TObject::TObject()
  105. {
  106.     if (pObjectAllocationFlag)
  107.     {
  108.         CStr255 message(IsObject(pLastObject) ? pLastObject->GetClassName() : "Someone");
  109.  
  110.         message += " forgot to call IObject or ReadFrom!";
  111.  
  112.         fprintf(stderr, "%s\n", (const char*)message);
  113.     }
  114.  
  115.     pObjectAllocationFlag = TRUE;                // set the flag
  116.     pLastObject = this;
  117. }
  118. #endif
  119.  
  120. //----------------------------------------------------------------------------------------
  121. // TObject destructor
  122. //----------------------------------------------------------------------------------------
  123. #pragma segment MADestructorRes
  124.  
  125. TObject::~TObject()
  126. {
  127. }
  128.  
  129. //----------------------------------------------------------------------------------------
  130. // TObject::Clone: 
  131. //----------------------------------------------------------------------------------------
  132. #pragma segment MANonRes
  133.  
  134. TObject* TObject::Clone()
  135. {
  136.     TObject * result = (TObject *)operator new(GetClassSize());
  137.     MABlockMove(this, result, GetClassSize());
  138.  
  139. #if qTheDebugger
  140.     TheDbgr_Add_Object(result);
  141. #endif
  142.  
  143. #if qInspector
  144.     if (NubIsInstalled())
  145.         NubNewObject(this, ClassName(GetClassName()));
  146. #endif
  147.  
  148.     return result;
  149. }
  150.  
  151. //----------------------------------------------------------------------------------------
  152. // TObject::Free: 
  153. //----------------------------------------------------------------------------------------
  154. #pragma segment MAObjectRes
  155.  
  156. void TObject::Free()
  157. {
  158.     if (RemoveDependenciesOnFree())
  159.         RemoveAllDependencies();
  160.  
  161. #if qTheDebugger
  162.     TheDbgr_Delete_Object(this);
  163. #endif
  164.  
  165. #if qInspector
  166.     if (NubIsInstalled())
  167.         NubObjectFreed(this, ClassName(GetClassName()));
  168. #endif
  169.  
  170.     delete this;
  171. }
  172.  
  173. //----------------------------------------------------------------------------------------
  174. // TObject::IObject: 
  175. //----------------------------------------------------------------------------------------
  176. #if qDebug || qSym || qInspector || qTheDebugger
  177. #pragma segment MAObjectRes
  178.  
  179. void TObject::IObject()
  180. {
  181. #if qDebug || qSym
  182.     fClassID = GetClassID();
  183. #endif
  184.  
  185. #if qInspector
  186.     pObjectAllocationFlag = FALSE;                // clear the flag
  187.     pLastObject = NULL;
  188. #endif
  189.  
  190. #if qTheDebugger
  191.     TheDbgr_Add_Object(this);
  192. #endif
  193.  
  194. #if qInspector
  195.     if (NubIsInstalled())
  196.         NubNewObject(this, ClassName(GetClassName()));
  197. #endif
  198. }
  199. #endif
  200.  
  201. //----------------------------------------------------------------------------------------
  202. // TObject::Hash: 
  203. //----------------------------------------------------------------------------------------
  204. #pragma segment MAObjectRes
  205.  
  206. HashValue TObject::Hash() const
  207. {
  208.     return (long)this >> 2;
  209. }
  210.  
  211. //----------------------------------------------------------------------------------------
  212. // TObject::IsEqual: 
  213. //----------------------------------------------------------------------------------------
  214. #pragma segment MAObjectRes
  215.  
  216. Boolean TObject::IsEqual(const TObject*            /* theObject */ ) const
  217. {
  218. #if    qDebug
  219.     ProgramBreak("You need to override the IsEqual method");
  220. #endif
  221.  
  222.     return FALSE;
  223. }
  224.  
  225. //----------------------------------------------------------------------------------------
  226. // TObject::CompareObject: 
  227. //----------------------------------------------------------------------------------------
  228. #pragma segment MAObjectRes
  229.  
  230. ComparisonResult TObject::CompareObject(const TObject* arg) const
  231. {
  232.     ComparisonResult returnVal = kEqual;
  233.  
  234.     if (IsLessThan(arg))
  235.         returnVal = kLessThan;
  236.     else if (IsGreaterThan(arg))
  237.         returnVal = kGreaterThan;
  238.  
  239.     return returnVal;
  240. }
  241.  
  242. //----------------------------------------------------------------------------------------
  243. // TObject::IsGreaterThan: 
  244. //----------------------------------------------------------------------------------------
  245. #pragma segment MAObjectRes
  246.  
  247. Boolean TObject::IsGreaterThan(const TObject*) const
  248. {
  249. #if    qDebug
  250.     ProgramBreak("You need to override the IsGreaterThan method");
  251. #endif
  252.  
  253.     return FALSE;
  254. }
  255.  
  256. //----------------------------------------------------------------------------------------
  257. // TObject::IsLessThan: 
  258. //----------------------------------------------------------------------------------------
  259. #pragma segment MAObjectRes
  260.  
  261. Boolean TObject::IsLessThan(const TObject*) const
  262. {
  263. #if qDebug
  264.     ProgramBreak("You need to override the IsLessThan method");
  265. #endif
  266.  
  267.     return FALSE;
  268. }
  269.  
  270. //----------------------------------------------------------------------------------------
  271. // TObject::Changed: 
  272. //----------------------------------------------------------------------------------------
  273. #pragma segment MAObjectRes
  274.  
  275. void TObject::Changed(ChangeID theChange,
  276.                       TObject* changedBy)
  277. {
  278.     TDependencySpace * itsDependencySpace = GetDependencySpace();
  279.     if (itsDependencySpace)
  280.         itsDependencySpace->NotifierChanged(this, theChange, changedBy);
  281. }
  282.  
  283. //----------------------------------------------------------------------------------------
  284. // TObject::DoUpdate: 
  285. //----------------------------------------------------------------------------------------
  286. #pragma segment MAObjectRes
  287.  
  288. void TObject::DoUpdate(ChangeID                    /* theChange */,
  289.                        TObject*                    /* changedObject */ ,
  290.                        TObject*                    /* changedBy */ ,
  291.                        TDependencySpace*        /* dependencySpace */ )
  292. {
  293. }
  294.  
  295. //----------------------------------------------------------------------------------------
  296. // TObject::GetDependencySpace: 
  297. //----------------------------------------------------------------------------------------
  298. #pragma segment MAObjectRes
  299.  
  300. TDependencySpace* TObject::GetDependencySpace()
  301. {
  302.     return gMacAppDependencies;
  303. }
  304.  
  305. //----------------------------------------------------------------------------------------
  306. // TObject::AddDependent: 
  307. //----------------------------------------------------------------------------------------
  308. #pragma segment MAObjectRes
  309.  
  310. void TObject::AddDependent(TObject* dependent)
  311. {
  312.     TDependencySpace * itsDependencySpace = GetDependencySpace();
  313.     if (itsDependencySpace)
  314.         itsDependencySpace->AddDependency(this, dependent, kNoLabel);
  315. }
  316.  
  317. //----------------------------------------------------------------------------------------
  318. // TObject::RemoveDependent: 
  319. //----------------------------------------------------------------------------------------
  320. #pragma segment MAObjectRes
  321.  
  322. void TObject::RemoveDependent(TObject* dependent)
  323. {
  324.     TDependencySpace * itsDependencySpace = GetDependencySpace();
  325.     if (itsDependencySpace)
  326.         itsDependencySpace->RemoveDependency(this, dependent, kNoLabel);
  327. }
  328.  
  329. //----------------------------------------------------------------------------------------
  330. // TObject::RemoveAllDependencies: 
  331. //----------------------------------------------------------------------------------------
  332. #pragma segment MAObjectRes
  333.  
  334. void TObject::RemoveAllDependencies()
  335. {
  336.     TDependencySpace * itsDependencySpace = GetDependencySpace();
  337.     if (itsDependencySpace)
  338.         itsDependencySpace->RemoveDependencies(this);// Call the routine in UDependencies 
  339. }
  340.  
  341. //----------------------------------------------------------------------------------------
  342. // TObject::RemoveDependenciesOnFree: 
  343. //----------------------------------------------------------------------------------------
  344. #pragma segment MAObjectRes
  345.  
  346. Boolean TObject::RemoveDependenciesOnFree()
  347. {
  348.     return TRUE;                                // By default we always assume we might have dependents
  349. }
  350.  
  351. //----------------------------------------------------------------------------------------
  352. // TObject::IsMarked: 
  353. //----------------------------------------------------------------------------------------
  354. #pragma segment MAObjectRes
  355.  
  356. Boolean TObject::IsMarked()
  357. {
  358.     return FALSE;
  359. }
  360.  
  361. //----------------------------------------------------------------------------------------
  362. // TObject::SetMark: 
  363. //----------------------------------------------------------------------------------------
  364. #pragma segment MAObjectRes
  365.  
  366. void TObject::SetMark(Boolean                    /* state */)
  367. {
  368. }
  369.  
  370. //----------------------------------------------------------------------------------------
  371. // TObject::GetStandardSignature: 
  372. //----------------------------------------------------------------------------------------
  373. #pragma segment MAWriteResource
  374.  
  375. IDType TObject::GetStandardSignature()
  376. {
  377.     return (GetClassDescDynamic())->GetSignature();
  378. }
  379.  
  380. //----------------------------------------------------------------------------------------
  381. // TObject::ReadFrom: 
  382. //----------------------------------------------------------------------------------------
  383. #pragma segment MAReadResource
  384.  
  385. void TObject::ReadFrom(TStream*                    /* aStream */ )
  386. {
  387. #if qDebug || qSym
  388.     fClassID = GetClassID();
  389. #endif
  390.  
  391. #if qInspector
  392.     pObjectAllocationFlag = FALSE;                // clear the flag
  393.     pLastObject = NULL;
  394. #endif
  395.  
  396. #if qTheDebugger
  397.     TheDbgr_Add_Object(this);
  398. #endif
  399.  
  400. #if qInspector
  401.     if (NubIsInstalled())
  402.         NubNewObject(this, ClassName(GetClassName()));
  403. #endif
  404. }
  405.  
  406. //----------------------------------------------------------------------------------------
  407. // TObject::WriteTo: 
  408. //----------------------------------------------------------------------------------------
  409. #pragma segment MAWriteResource
  410.  
  411. void TObject::WriteTo(TStream*                    /* aStream */ )
  412. {
  413. }
  414.  
  415. //----------------------------------------------------------------------------------------
  416. // TObject::SubClassResponsibility: 
  417. //----------------------------------------------------------------------------------------
  418. #if qDebugMsg
  419. #pragma segment MAObjectRes
  420.  
  421. void TObject::SubClassResponsibility()
  422. {
  423.     ClassName s;
  424.     GetCallersMethodName(s);
  425.  
  426.     fprintf(stderr, "%s: must be overridden!", (const char*)s);
  427. }
  428. #endif
  429.  
  430. //----------------------------------------------------------------------------------------
  431. // End of UObject.cp
  432.  
  433. #pragma segment Inline
  434.